package com.example.summary.thread;

import java.util.Date;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.function.*;

public class TestCompletableFuture {


    public static void main(String[] args) {

//        CompletableFuture f1 = CompletableFuture.runAsync(() -> {
//            System.out.println(new Date() + "||f1");
//        }).thenAccept(aVoid -> {
//            System.out.println(new Date() + "||洗水壶");
//            try {
//                Thread.sleep(5000L);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }).thenAccept(aVoid -> {
//            System.out.println(new Date() + "||烧水");
//            try {
//                Thread.sleep(10000L);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        });
//
//        CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
//            System.out.println(new Date() + "||f2");
//            return 1;
//        }).thenApply(integer -> {
//            System.out.println(new Date() + "||洗茶壶");
//            try {
//                Thread.sleep(1000L);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            return integer + "2";
//        }).thenApply(integer -> {
//            System.out.println(new Date() + "||洗茶杯");
//            try {
//                Thread.sleep(2000L);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            return integer + "3";
//        }).thenApply(integer -> {
//            System.out.println(new Date() + "||拿茶叶");
//            try {
//                Thread.sleep(3000L);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            return integer + "4||龙井";
//        });
//
//        CompletableFuture<String> f3 = f1.thenCombine(f2, (o, o2) -> {
//            System.out.println(new Date() + "拿到茶叶" + o2);
//            System.out.println(new Date() + "上茶");
//            return o2;
//        });
//
//        System.out.println(f3.join());


        CompletableFuture<Integer>
                f0 = CompletableFuture
                .supplyAsync(() -> 7 / 0)
                .thenApply(r -> r * 10)
                .whenComplete((integer, throwable) -> System.out.println(0));
//                .exceptionally(e -> 0);
        System.out.println(f0.join());

    }


}
